package br.ufpa.cbcc2007.dikemon.map.actors;

import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;

import br.ufpa.cbcc2007.dikemon.map.Actor;
import br.ufpa.cbcc2007.dikemon.map.Collideable;
import br.ufpa.cbcc2007.dikemon.map.MapScene;

//Classe que representa um herói controlável.
// Não deve haver mais de um herói ao mesmo tempo instanciado
public class Hero extends Actor implements Collideable{
	private boolean freeMovement;	//Se o herói tem movimentação livre
	private static Hero hero;		//Singleton instance

	//Construtor
	public Hero(Image image, int frameWidth, int frameHeight, int gridX, int gridY) {
		super(image, frameWidth, frameHeight, gridX, gridY);
		freeMovement = true;
		hero = this;
	}

	//Atualização
	public void actualize() {
		super.actualize(); 									//Atualização padrão da super classe.
		if(!freeMovement) return;							//Se movimentação não é livre, termine aqui
		int keys = MapScene.getMapScene().getKeyState();	//Obter o estado dos botões do frame atual
		if((keys & GameCanvas.DOWN_PRESSED) != 0){			//Se botão para baixo está pressionado
			if(getFaceDir()==0)walk(0);						//Se estiver olhando para baixo, andar para baixo
			else setFaceDir(0);								//Senão, olhar para baixo.
		}
		else if((keys & GameCanvas.RIGHT_PRESSED) != 0){	//Se botão para direita está pressionado
			if(getFaceDir()==1)walk(1);						//Se estiver olhando para direita, andar para direita
			else setFaceDir(1);								//Senão, olhar para direita.
		}
		else if((keys & GameCanvas.UP_PRESSED) != 0){		//Se botão para cima está pressionado
			if(getFaceDir()==2)walk(2);						//Se estiver olhando para cima, andar para cima
			else setFaceDir(2);								//Senão, olhar para cima.
		}
		else if((keys & GameCanvas.LEFT_PRESSED) != 0){		//Se botão para esquerda está pressionado
			if(getFaceDir()==3)walk(3);						//Se estiver olhando para esquerda, andar para esquerda
			else setFaceDir(3);								//Senão, olhar para esquerda.
		}
	}

	public void setFreeMovement(boolean freeMovement) {
		this.freeMovement = freeMovement;
	}

	public boolean isFreeMovement() {
		return freeMovement;
	}

	//Quando colidir
	public void collides(Collideable other) {
		//Se colidir for com uma parede.
		//Como não é mais necessária, é provavel que seja deletada
		if(other instanceof Wall){
			restoreGridPosition();
			align2Grig();
		}
		else 
			super.collides(other);//Colisão da classe base
	}

	public static Hero getHero() {
		return hero;
	}

}
